
// node中的模块 es6moudle commonjs规范 两种规范
//用webpack打包后 es6Module -> commonjs模块（tree-shaking） 所以前端代码都用es6去写
//es6 静态模块(tree-shaking)可以在编译的时候进行分析 ;动态模块 在执行的时候引入模块（无法做tree-shaking）

//commonjs模块规范
//1.每个文件都是一个模块 （每个模块外面都有一个函数）
//2.文件需要被别人使用 需要导出module.exports = xxx
//3. 如果需要使用别人 那就需要require语法

//模块的分类 1.核心模块、内置模块（node自带的模块 fs http vm....）
//2.第三方模块（使用别人的模块需要安装co）
//3.文件模块 别人引用的时候需要通过需要通过相对路径或者绝对路径来引用

/*
//fs path vm内置模块
//什么时候用同步 什么时候用异步？当代已经在运行状态下了 尽量少使用同步（阻塞）
const fs = require('fs');//require内部就是使用readFileSync来实现的
//读取文件如果不存在会发生异常
let r = fs.readFileSync('./第一次作业1.js','uft8');
let exists = fs.existsSync("./第一次作业.js");//判断文件是否存在异步方法已经被废弃了exits因为第一个参数不是
*/
const path = require('path');//处理路径的模块：resolve join
//一般用resolve 都会加上__dirname 修正目录
/* console.log(path.resolve(__dirname,'a',"b","c"));//解析绝对路径 解析默认采用process.cwd(); 如果有/ 会回到根目录
console.log(path.join(__dirname,"a","b","c"));//仅仅是拼接,不会产生绝对路径 遇到/也会拼在一期 如果想拼接上绝对路径加上__dirname
console.log(path.extname('a.min.js'));//获取文件后缀名
console.log(path.basename('a.js', 's'));//根据给定的第二个参数 获取文件名称
console.log(path.relative('a/b/c/1.js', 'a')); //根据路径获取相对路径..\..\..
console.log(path.dirname('a/b/c'));//取当前文件的路径 __dirname的实现 就是path.dirname */

//字符串如何能变成js执行
//eval会受执行环境影响
//new Function "模板引擎的实现原理 可以获取全局变量 还是会有污染的情况（他不会受环境影响 会创建一个和最外层平级的作用域）
//new Function 浏览器里全局是可以 node中或者绝不 var a是拿不到的
console.log(new Function('a','b','console.log(a)').toString()) 

//node中自己实现了一个模块 vm 不受影响（沙箱环境） 快照（执行时记录信息 执行后还原信息）
//proxy实现

//this!=global
//global var a = 1000 尽量不要使用global
global.a = 100;//这里的a不是全局的 当前函数内的变量
new Function('b','console.log(a,b)')('b');
const vm = require('vm')
vm.runInThisContext(`console.log(a)`);//在node中全局变量是多个模块下共享的 所以i尽量不要通过global来设置属性
//总是被创建于全局环境 因此在运行时他们只能访问全局变量和自己的局部变量

//global.xx
//全局一个 1个上下文 默认外边闭包函数
    //function (exports,module,require,__dirname){}
    //runInThisContext不会产生函数 和上边的function平行的
//runInThisContext（不在函数下执行）
//runInNewContext（最外层环境）

//requie的实现 1.读取文件 2.读取后给文件抱一个函数 3.通过runInThisContext将他变成js语法 4.调用


//process 
//1.platform(win32) mac -> darwin
//2. chdir
//3.cwd current working directory 当前工作目录(在哪运行就是哪个目录) 可以改变 webpack会自动查找运行webpack的目录下查找webpack.config.js
//4. env 
//5.argv
//6.nextTick

//process.chdir('../');
console.log(process.env);


